import CryptoJS from "crypto-js";

// 需要转成布尔类型的字符串
const BOOLEAN_TYPE = ["true", "false"];
// 和java 后台配套，如果改了前端，后台也需要改.
const CBCKEY = CryptoJS.enc.Utf8.parse(import.meta.env.VITE_APP_ENCRYPTION_KEY);
const CBCIV = CryptoJS.enc.Utf8.parse(import.meta.env.VITE_APP_ENCRYPTION_IV);

/**
 * 加密
 * @param word utf8 的字符串
 * @returns {string} 加密后base64编码的字符串
 */
export function encryptCbc(word) {
  // 将utf8字符转为字节数组.
  const src = CryptoJS.enc.Utf8.parse(word);
  // 加密模式为CBC，补码方式为PKCS5Padding（也就是PKCS7）
  const encrypted = CryptoJS.AES.encrypt(src, CBCKEY, {
    iv: CBCIV,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });

  //返回base64
  return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
}

/**
 * 解密
 * @param word base64 编码的字符串
 * @returns {string} 解密后的字符串 utf8 编码
 */
export function decryptCbc(word) {
  if (!word) {
    return "";
  }
  // 解密模式为CBC，补码方式为PKCS5Padding（也就是PKCS7）
  const decrypt = CryptoJS.AES.decrypt(word, CBCKEY, {
    iv: CBCIV,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });

  return decrypt.toString(CryptoJS.enc.Utf8);
}

/**
 * string类型转布尔类型
 * @param value 转换的值
 * @returns {boolean}
 */
const booleanConversion = (value) => {
  return JSON.parse(value);
};

/**
 * 判断是否解密
 * @param word
 * @returns {*}
 */
const decrypt = (word) => {
  if (!word?.startsWith("ENC:")) {
    // 当值不是ENC:开头的，则直接返回
    return word;
  }
  return decryptCbc(word.substring(4));
};

/**
 * 对env文件的变量进行预处理，当为"true", "false"的时，则转换为布尔值，当为非ENC:开头的，则直接返回，当为ENC:开头的，则进行解密,
 * @param word 需要预处理的值
 * @returns {*|string|boolean}
 */
export function envPreprocessing(word) {
  // 尝试将word转换为布尔值，如果失败则保持原样
  if (BOOLEAN_TYPE.includes(word)) {
    // 当值为"true"或"false"时，则转换为布尔值
    return booleanConversion(word);
  }
  return decrypt(word);
}
